<chapter xml:id="utf8.reader.h">
<title><tt>__vic/utf8/reader.h</tt></title>

<chapter xml:id="utf8--reader">
<title><tt>utf8::reader</tt></title>

<code-block lang="C++"><![CDATA[
template<class ByteSReader>
class utf8::reader
{
public:
    using byte_reader_type = ByteSReader;
    ByteSReader &get_byte_reader();
    const ByteSReader &get_byte_reader() const;

    template<class... Args>
    explicit reader(Args&&... args); // since C++11

    reader(); // C++98 only
    explicit reader(ByteSReader r); // C++98 only

    utf8::read_result parse();
    sread_result<unicode_t> read()
    sread_result<unicode_t> operator()();
};

template<class ByteSReader>
utf8::reader<ByteSReader> utf8::make_reader(ByteSReader r);
]]></code-block>

<p>Вычитывает UTF-8 code points из последовательности байтов.
Последовательность читается посредством <tt>ByteSReader</tt>, который
моделирует <tt>sreader&lt;unsigned char></tt> (см. <xref to="sreaders"/>).</p>

<section><title>Члены класса</title>

<synopsis>
<prototype>ByteSReader &amp;get_byte_reader()</prototype>
<prototype>const ByteSReader &amp;get_byte_reader() const</prototype>
<p>Возвращает ссылку на используемый byte reader.</p>
</synopsis>

<synopsis>
<prototype>template&lt;class... Args>
explicit reader(Args&amp;&amp;... args) <badge>C++11</badge></prototype>
<p>Передаёт все параметры в используемый byte reader.</p>
</synopsis>

<synopsis>
<prototype>reader() <badge>C++98 only</badge></prototype>
<prototype>explicit reader(ByteSReader r) <badge>C++98 only</badge></prototype>
<p>Конструкторы для режима C++98.</p>
</synopsis>

<synopsis>
<prototype>utf8::read_result parse()</prototype>
<p>Пытается извлечь следующий code point из последовательности байтов, используя
<tt>ByteSReader</tt>. В случае успеха возвращается прочитанный code point. Если
байты кончились, возвращается <tt>utf8::status::eof</tt>. Другие значения
возвращаются в случае ошибок, подробности см. в <xref to="utf8--status"/>. Для
доступа к отдельным байтам используется <tt>ByteSReader::operator()</tt>.</p>
<note>Функция сама по себе не бросает исключений, но их может бросать
<tt>ByteSReader::operator()</tt>.</note>
</synopsis>

<synopsis>
<prototype>sread_result&lt;unicode_t> read()</prototype>
<prototype>sread_result&lt;unicode_t> operator()()</prototype>
<p>То же самое, что <tt>parse()</tt>, но возвращает <tt>sread_result</tt> в
случае успеха или при достижении конца файла. Бросает исключения из
<xref to="utf8.exceptions.h"/> в остальных случаях.</p>
</synopsis>

</section>

<section><title>Свободные функции</title>

<synopsis>
<prototype>template&lt;class ByteSReader>
utf8::reader&lt;ByteSReader> utf8::make_reader(ByteSReader r)</prototype>
<p>Создаёт UTF-8 reader используя указанный <tt>ByteSReader</tt>.</p>
</synopsis>

</section>

<section><title>Пример</title>
<code-block lang="C++"><![CDATA[
#include<__vic/utf8/reader.h>
#include<__vic/sreaders/string.h>
#include<string>
#include<cstdint>
#include<iostream>

// C++11
using utf8_string_reader = __vic::utf8::reader<__vic::string_sreader>;

// C++98
struct utf8_string_reader : __vic::utf8::reader<__vic::string_sreader>
{
    explicit utf8_string_reader(const std::string &s)
        : __vic::utf8::reader<__vic::string_sreader>(__vic::string_sreader(s)) {}
};

void print_utf8_code_points(const string &s)
{
    utf8_string_reader r(s);
    while(__VIC_SREAD_RESULT(unicode_t) cp = r())
        std::cout << uint_least32_t(cp.value()) << '\n';
}
]]></code-block>
</section>

</chapter>

</chapter>
